﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Entities;
using System.ComponentModel;
using Cesave.Application.Permisos.ServiceAgent;
using System.Windows.Forms;
using Cesave.Domain.Core.Entities;

namespace Cesave.Presentation.Permisos.WinForms.Client.ViewModels.Catalogs.Cultivos
{
    /// <summary>
    /// Manejo de fechas de cultivo.
    /// </summary>
    public partial class CultivosViewModel
    {
        #region Private properties

        /// <summary>
        /// Lista de fechas de cultivo.
        /// </summary>
        private List<CultivosFecha> _fechas;

        /// <summary>
        /// Fecha seleccionada.
        /// </summary>
        private CultivosFecha _fecha;

        #endregion

        #region Public properties

        /// <summary>
        /// Lista de fechas de cultivo.
        /// </summary>
        public List<CultivosFecha> Fechas
        {
            get
            {
                return _fechas;
            }
            private set
            {
                _fechas = value;
                if (_fechas != null)
                    RaisePropertyChanged("Fechas");
            }
        }

        /// <summary>
        /// Fecha seleccionada.
        /// </summary>
        public CultivosFecha Fecha
        {
            get
            {
                return _fecha;
            }
            private set
            {
                _fecha = value;
                if (_fecha != null)
                    RaisePropertyChanged("Fecha");
            }
        }

        #endregion

		#region Private methods

		/// <summary>
		/// Carga las fechas de cultivo de acuerdo al cultivo,
		/// el ciclo y la junta.
		/// </summary>
		private void LoadFechas()
		{
			_view.cultivosFechasBindingSource.AddingNew += AddingNewFecha;
			StartWaiting();
			using (BackgroundWorker worker = new BackgroundWorker())
			{
				worker.DoWork += (sender, e) =>
				{
					using (PermisosModuleServiceWrapper service = new PermisosModuleServiceWrapper())
					{
						e.Result = service.FindCultivosFechasByCultivoAndCicloAndJunta(Cultivo.CultivoGuid, Ciclo.CicloGuid, _pusSettings.Junta.JuntaGuid);
					}
				};
				worker.RunWorkerCompleted += (sender, e) =>
				{
					EndWaiting();
					if (!e.Cancelled && e.Error == null)
						Fechas = e.Result as List<CultivosFecha>;
					else if (e.Error != null)
						ShowMessage(e.Error.Message);
				};
				worker.WorkerSupportsCancellation = true;
				worker.RunWorkerAsync();
			}
		}

		#endregion

		#region Event methods

		/// <summary>
		/// Envía los cambios realizados a las fechas de siembra.
		/// </summary>
		private void SaveFechas(object s, EventArgs args)
		{
			using (BackgroundWorker worker = new BackgroundWorker())
			{
				worker.DoWork += (sender, e) =>
				{
					using (PermisosModuleServiceWrapper service = new PermisosModuleServiceWrapper())
					{
						Fechas.ForEach(fecha =>
						{
							if (fecha.ChangeTracker.State == ObjectState.Added)
								service.AddCultivosFecha(fecha);
							else
								service.ChangeCultivosFecha(fecha);
							fecha.AcceptChanges();
						});
					}
				};
				worker.RunWorkerCompleted += (sender, e) =>
				{
					if (e.Error != null)
						ShowMessage(e.Error.Message);
				};
				worker.WorkerSupportsCancellation = true;
				worker.RunWorkerAsync();
			}
		}

		/// <summary>
		/// Se ejecuta cuando se está agregando una nueva fecha
		/// al BindingSource de fechas de cultivo.
		/// </summary>
		private void AddingNewFecha(object sender, AddingNewEventArgs e)
		{
			Fecha = new CultivosFecha
			{
				CicloGuid = Ciclo.CicloGuid,
				CicloId = Ciclo.CicloId,
				CultivoGuid = Cultivo.CultivoGuid,
				CultivoId = Cultivo.CultivoId,
				DestruccionDeSoca = string.Empty,
				FechaGuid = Guid.NewGuid(),
				FechaId = 0,
				FinDeSiembra = DateTime.Now,
				FinDeSolicitud = DateTime.Now,
				InicioDeSiembra = DateTime.Now,
				InicioDeSolicitud = DateTime.Now,
				JuntaGuid = _pusSettings.Junta.JuntaGuid,
				JuntaId = _pusSettings.Junta.JuntaId,
				Vigencia = DateTime.Now,
			};
			Fecha.MarkAsAdded();
			e.NewObject = Fecha;
		}

		/// <summary>
		/// Identifica la fecha de cultivo seleccionada.
		/// </summary>
		private void SetCurrentFecha(object sender, EventArgs e)
		{
			BindingSource bindingSource = sender as BindingSource;
			if (bindingSource != null && bindingSource.Current != null)
				Fecha = bindingSource.Current as CultivosFecha;
		}

		/// <summary>
		/// Se ejecuta cuando la propiedad Fechas cambia de valor.
		/// </summary>
		private void OnFechasPropertyChanged()
		{
			_view.cultivosFechasBindingSource.DataSource = Fechas;
			_view.cultivosFechasBindingSource.CurrentChanged += SetCurrentFecha;
			SetCurrentFecha(_view.cultivosFechasBindingSource, new EventArgs());
		}

		/// <summary>
		/// Se ejecuta cuando la propiedad Fecha cambia de valor.
		/// </summary>
		private void OnFechaPropertyChanged()
		{
			if (IsCicloReady)
			{
				Fecha.CicloGuid = Ciclo.CicloGuid;
				Fecha.CicloId = Ciclo.CicloId;
			}
		}

		#endregion

	}
}
